package com.example.demo.security.service;

import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.util.StrUtil;
import com.example.demo.security.util.SecurityUtils;
import com.example.demo.service.SysRoleService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.util.PatternMatchUtils;

import java.util.Collections;
import java.util.Set;

/**
 * SpringSecurity 权限校验
 */
@Component("ss")
@Slf4j
public class PermissionService {

    @Autowired
    private SysRoleService sysRoleService;

    /**
     * 判断当前登录用户是否拥有操作权限
     *
     * @param requiredPerm 所需权限
     * @return 是否有权限
     */
    public boolean hasPerm(String requiredPerm) {
        if (StrUtil.isBlank(requiredPerm)) {
            return false;
        }
        // 获取当前登录用户的角色编码集合
        Set<String> roleIds = SecurityUtils.getRoles();
        if (CollectionUtil.isEmpty(roleIds)) {
            return false;
        }
        // 获取当前登录用户的所有角色的权限列表
        Set<String> rolePerms = this.getRolePermsFormCache(roleIds);
        if (CollectionUtil.isEmpty(rolePerms)) {
            return false;
        }
        // 判断当前登录用户的所有角色的权限列表中是否包含所需权限
        boolean hasPermission = rolePerms.stream().anyMatch(rolePerm ->
                // 匹配权限，支持通配符(* 等)
                PatternMatchUtils.simpleMatch(rolePerm, requiredPerm)
        );

        if (!hasPermission) {
            log.error("用户无操作权限：{}", requiredPerm);
        }
        return hasPermission;
    }


    /**
     * 从缓存中获取角色权限列表
     *
     * @param roleIds 角色编码集合
     * @return 角色权限列表
     */
    private Set<String> getRolePermsFormCache(Set<String> roleIds) {
        // 检查输入是否为空
        if (CollectionUtil.isEmpty(roleIds)) {
            return Collections.emptySet();
        }
        // TODO: 缓存角色权限列表
        return sysRoleService.getRolePermissions(roleIds);
    }

}
